/**
 * 给定一条直线，给定2N个点，问最多有多少条线段与直线相交，给出方案。
 * 根据点与直线的位置关系，将点分为三类：
 * 正、负、零。
 * 优先匹配正、负，然后正、负最多只剩下一类，再将这一类与令匹配。
 * 然后如果零还有剩下的，每两个零可以匹配。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

int N;
llt K, B;
vector<pii> P;

void work(){
    cin >> N >> K >> B;
    P.assign(N+N, {});
    for(auto & p : P) cin >> p.first >> p.second;

    vi zheng, fu, ling;
    for(int i=0;i<N+N;++i){
        auto tmp = K * P[i].first + B;
        if(tmp > P[i].second) zheng.emplace_back(i);
        else if(tmp == P[i].second) ling.emplace_back(i);
        else fu.emplace_back(i); 
    }

    int ans = 0;
    vector<tuple<int, int, char>> Ans;
    if(zheng.size() <= fu.size()){
        int n = zheng.size();
        for(int i=0;i<n;++i){
            Ans.emplace_back(zheng[i], fu[i], 'Y');
            ans += 1;
        }
        if(fu.size() - n <= ling.size()){
            int m = fu.size() - n;
            for(int i=0,j=n;i<m;++i,++j){
                Ans.emplace_back(fu[j], ling[i], 'Y');
                ans += 1;
            }
            for(int i=m;i<ling.size();i+=2){
                assert(i + 1 < ling.size());
                Ans.emplace_back(ling[i], ling[i + 1], 'Y');
                ans += 1;
            }
        }else{
            int m = ling.size();
            for(int i=0,j=n;i<m;++i,++j){
                Ans.emplace_back(fu[j], ling[i], 'Y');
                ans += 1;
            }
            for(int i=n+m;i<fu.size();i+=2){
                assert(i + 1 < fu.size());
                Ans.emplace_back(fu[i], fu[i + 1], 'N');
            }
        }
    }else{
        int n = fu.size();
        for(int i=0;i<n;++i){
            Ans.emplace_back(zheng[i], fu[i], 'Y');
            ans += 1;
        }    
        int m = zheng.size() - n;
        if(m <= ling.size()){
            for(int i=0,j=n;i<m;++i,++j){
                Ans.emplace_back(zheng[j], ling[i], 'Y');
                ans += 1;
            }
            for(int i=m;i<ling.size();i+=2){
                Ans.emplace_back(ling[i], ling[i + 1], 'Y');
                ans += 1;
            }
        }else{
            for(int i=0,j=n;i<ling.size();++i,++j){
                Ans.emplace_back(zheng[j], ling[i], 'Y');
                ans += 1;
            }
            for(int i=n+ling.size();i<zheng.size();i+=2){
                Ans.emplace_back(zheng[i], zheng[i + 1], 'N');
            }
        }    
    }

    cout << ans << endl;
    for(auto [a, b, c] : Ans){
        cout << a + 1 << " " << b + 1 << " " << c << "\n";
    }
    return; 
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}